/**
 * 给你一个下标从 0 开始的数组 nums ，数组中有 n 个整数，另给你一个整数 k 。
 * <p>
 * 半径为 k 的子数组平均值 是指：nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值，即下标在 i - k
 * <p>
 * 和 i + k 范围（含 i - k 和 i + k）内所有元素的平均值。如果在下标 i 前或后不足 k 个元素，那么 半径为 k 的子数组平均值 是 -1 。
 * <p>
 * 构建并返回一个长度为 n 的数组 avgs ，其中 avgs[i] 是以下标 i 为中心的子数组的 半径为 k 的子数组平均值 。
 * <p>
 * x 个元素的 平均值 是 x 个元素相加之和除以 x ，此时使用截断式 整数除法 ，即需要去掉结果的小数部分。
 * <p>
 * 例如，四个元素 2、3、1、5 的平均值是 (2 + 3 + 1 + 5) / 4 = 11 / 4 = 2.75，截断后得到 2 。
 */

class Solution {
    public int[] getAverages(int[] nums, int k) {
        int n = nums.length;
        int windowSum = 0;
        int[] result = new int[n];
        Arrays.fill(result, -1); // 初始化结果数组为-1

        if(k==0){
            return nums;
        }
        if (2 * k + 1 > n) {
            return result; // 如果窗口大小大于数组长度，直接返回全-1的数组
        }

        // 1.计算初始窗口的和
        long windowSum = 0;     //这个地方要用long
        for (int i = 0; i < 2 * k + 1; i++) {
            windowSum += nums[i];
        }

        //2.为后续的元素进行赋值
        for (int i = k; i < n - k; i++) {
            result[i] = (int) (windowSum / (2 * k + 1));
            if (i < n - k - 1) {
                windowSum += nums[i + k + 1] - nums[i - k];
            }
        }

        return result;
    }



    /**解法二：*/

    public int[] getAverages2(int[] nums, int k) {
        int n = nums.length;
        int[] result = new int[n];
        Arrays.fill(result, -1); // 初始化结果数组为-1

        if (k == 0) {
            return nums; // 如果k为0，直接返回原数组
        }

        if (2 * k + 1 > n) {
            return result; // 如果窗口大小大于数组长度，直接返回全-1的数组
        }

        // 计算初始窗口的和
        long windowSum = 0;
        for (int i = 0; i < 2 * k + 1; i++) {
            windowSum += nums[i];
        }

        // 计算滑动窗口的平均值
        for (int i = k; i < n - k; i++) {
            result[i] = (int) (windowSum / (2 * k + 1));
            if (i < n - k - 1) {
                windowSum += nums[i + k + 1] - nums[i - k];
            }
        }

        return result;
    }
}